package br.com.aspas.persistencia;

import br.com.aspas.modelo.Caixa;
import br.com.aspas.modelo.Evento;
import br.com.aspas.modelo.PessoaJuridica;
import br.com.aspas.modelo.Recebimentos;
import br.com.aspas.modelo.Sexo;
import br.com.aspas.util.AbstractDAO;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;

public class CaixaDao extends AbstractDAO {

    public CaixaDao() {
    }

    public void inserir(Caixa caixa) {
        caixa.setDataInclusao(new Date());
        caixa.setDataCaixa(new Date());
        insert(caixa);
    }

    public Caixa findByPk(Integer pKey) {
        return (Caixa) findByPk(Caixa.class, pKey);
    }

    public Boolean remove(Integer id) {
        delete(id, Caixa.class);
        return new Boolean(true);
    }

    public void altera(Caixa caixa) {
        caixa.setDataModificacao(new Date());
        update(caixa);
    }

    public List<Caixa> findAllCaixa() {
        em = emf.createEntityManager();
        List<Caixa> listCaixa = em.createQuery("SELECT object(c) FROM Caixa as c ").getResultList();
        em.close();
        return listCaixa;
    }

    public List<Recebimentos> findRecebimentos(Evento evento, String situacao, String cpfCnpj, String tipoPessoa, String nome) {
        Query query = null;
        em = emf.createEntityManager();
        if (cpfCnpj == null) {
            if (tipoPessoa.equals("J")) {
                query = em.createQuery("SELECT r FROM Recebimentos r WHERE "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisicaJuridicaEventoPK.eventoCodigo = :evento AND "
                        + " r.status IN (" + situacao + ") AND "
                        + " (r.pessoaFisicaJuridicaEvento.pessoaJuridica.razaoSocial LIKE '%" + nome + "%' OR "
                        + " r.pessoaFisicaJuridicaEvento.pessoaJuridica.nomeFantasia LIKE '%" + nome + "%')");
            } else if (tipoPessoa.equals("F")) {
                query = em.createQuery("SELECT r FROM Recebimentos r WHERE "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisicaJuridicaEventoPK.eventoCodigo = :evento AND "
                        + " r.status IN (" + situacao + ") AND "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisica.nome LIKE '%" + nome + "%'");
            }

        } else {
            if (tipoPessoa.equals("J")) {
                query = em.createQuery("SELECT r FROM Recebimentos r WHERE "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisicaJuridicaEventoPK.eventoCodigo = :evento AND "
                        + " r.status IN (" + situacao + ") AND "
                        + " r.pessoaFisicaJuridicaEvento.pessoaJuridica.cnpj = :cnpj");
                query.setParameter("cnpj", cpfCnpj);
            } else if (tipoPessoa.equals("F")) {
                query = em.createQuery("SELECT r FROM Recebimentos r WHERE "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisicaJuridicaEventoPK.eventoCodigo = :evento AND "
                        + " r.status IN (" + situacao + ") AND "
                        + " r.pessoaFisicaJuridicaEvento.pessoaFisica.cpf  = :cpf ");
                query.setParameter("cpf", cpfCnpj);
            }

        }

        query.setParameter("evento", evento.getCodigo());


        List<Recebimentos> listRecebimentos = query.getResultList();
        em.close();
        return listRecebimentos;
    }

    public List<Caixa> findRecibo(Evento evento, String cpfCnpj, String nome) {
        Query query = null;
        em = emf.createEntityManager();

        query = em.createQuery("SELECT c FROM Caixa c "
                + "WHERE (c.nome LIKE '%" + nome + "%' "
                + "OR c.cpfcnpj LIKE '%" + cpfCnpj + "%') "
                + "AND c.evento.codigo = " + evento.getCodigo());
        List<Caixa> listRecibos = query.getResultList();
        em.close();
        return listRecibos;
    }

    public Integer getReciboCortesia(Evento evento, PessoaJuridica pessoaJuridica) {
        Query query = null;
        em = emf.createEntityManager();

        query = em.createQuery("SELECT COUNT(r) FROM Recebimentos r "
                + " WHERE r.evento.codigo = "+evento.getCodigo()
                + " AND r.pessoaFisicaJuridicaEvento.pessoaJuridica.codigo="+pessoaJuridica.getCodigo()
                + " AND r.caixa.codigo = 99998");
        Integer quantidade = (Integer) query.getSingleResult();
        em.close();
        
        return quantidade;

    }
}
